Public Class OGRSpatialReference

    Private obj As Long
    Private owned As Long

    ' ----------------------------------------------------------------------------
    Public Sub CInit(ByVal obj_in As Long, ByVal owned_in As Long)
        If obj <> 0 And owned <> 0 Then
            Call Destroy()
            Call GDALCore.OSRDestroySpatialReference(obj)
        End If
        obj = obj_in
        owned = owned_in
    End Sub

    ' ----------------------------------------------------------------------------
    Public Sub Destroy()
        If obj <> 0 Then
            'Call MsgBox("Destroy OGRSpatialReference: " & ExportToWkt())
            Call GDALCore.OSRDestroySpatialReference(obj)
            obj = 0
            owned = 0
        End If
    End Sub

    ' ----------------------------------------------------------------------------
    Public Function GetObjPtr() As Long
        GetObjPtr = obj
    End Function

    ' ----------------------------------------------------------------------------
    Public Function SetFromUserInput(ByVal InputText As String) As Long
        If obj <> 0 Then
            SetFromUserInput = GDALCore.OSRSetFromUserInput(obj, InputText)
        Else
            SetFromUserInput = GDALCore.ObjIsNULLError
        End If
    End Function

    ' ----------------------------------------------------------------------------
    Public Function Clone() As OGRSpatialReference
        Dim srs As New OGRSpatialReference
        If obj <> 0 Then
            Dim obj_new As Long

            obj_new = GDALCore.OSRClone(obj)
            Call srs.CInit(obj_new, 1)
        End If
        Clone = srs
    End Function

    ' ----------------------------------------------------------------------------
    Public Function CloneGeogCS() As OGRSpatialReference
        Dim srs As New OGRSpatialReference
        If obj <> 0 Then
            Dim obj_new As Long

            obj_new = GDALCore.OSRCloneGeogCS(obj)
            Call srs.CInit(obj_new, 1)
        End If
        CloneGeogCS = srs
    End Function

    ' ----------------------------------------------------------------------------
    Public Function ImportFromEPSG(ByVal EPSGCode As Long) As Long
        If obj <> 0 Then
            ImportFromEPSG = GDALCore.OSRImportFromEPSG(obj, EPSGCode)
        Else
            ImportFromEPSG = GDALCore.ObjIsNULLError
        End If
    End Function

    ' ----------------------------------------------------------------------------
    Public Function ExportToWkt() As String
        If obj <> 0 Then
            Dim wktptr As Long
            Dim err As Long

            err = GDALCore.OSRExportToWkt(obj, wktptr)
            ExportToWkt = GDALCore.CStr2VB(wktptr)
            ' We really should free wktptr here.
        Else
            ExportToWkt = ""
        End If
    End Function

    ' ----------------------------------------------------------------------------
    Public Function ExportToPrettyWkt(ByVal bSimplify As Long) As String
        If obj <> 0 Then
            Dim wktptr As Long
            Dim err As Long

            err = GDALCore.OSRExportToPrettyWkt(obj, wktptr, bSimplify)
            ExportToPrettyWkt = GDALCore.CStr2VB(wktptr)
            ' We really should free wktptr here.
        Else
            ExportToPrettyWkt = ""
        End If
    End Function

    ' ----------------------------------------------------------------------------
    Public Function SetAttrValue(ByVal NodePath As String, ByVal NodeValue As String) As Long
        If obj <> 0 Then
            SetAttrValue = GDALCore.OSRSetAttrValue(obj, NodePath, NodeValue)
        Else
            SetAttrValue = GDALCore.ObjIsNULLError
        End If
    End Function

    ' ----------------------------------------------------------------------------
    Public Function GetAttrValue(ByVal NodePath As String, ByVal iChild As Long) As String
        If obj <> 0 Then
            Dim c_str As Long
            c_str = GDALCore.OSRGetAttrValue(obj, NodePath, iChild)
            If c_str = 0 Then
                GetAttrValue = ""
            Else
                GetAttrValue = GDALCore.CStr2VB(c_str)
            End If
        Else
            GetAttrValue = ""
        End If
    End Function


    Public Sub New()

        obj = GDALCore.OSRNewSpatialReference("")
        owned = 1

    End Sub

    Protected Overrides Sub Finalize()
        MyBase.Finalize()
        If obj <> 0 And owned <> 0 Then
            Call Destroy()
        End If
    End Sub
End Class
